import TUICore, { TUIConstants } from '@tencentcloud/tui-core';
import {
	IMessageModel,
	TUIStore,
	StoreName,
	TUIChatService,
} from '@tencentcloud/chat-uikit-engine';
import TUIChatConfig from './config';

export default class TUIChatServer {
	public currentConversationID : string = '';
	public currentMessageList : IMessageModel[] = [];

	constructor() {
		// register service
		TUICore.registerService(TUIConstants.TUIChat.SERVICE.NAME, this);
		// watch current conversationID
		TUIStore.watch(StoreName.CONV, {
			currentConversationID: (id : string) => {
				this.currentConversationID = id;
			},
		});
		// watch current conversation message list
		TUIStore.watch(StoreName.CHAT, {
			messageList: (list : IMessageModel[]) => {
				this.currentMessageList = list;
			},
		});
	}

	public onCall(method : string, params : any, callback : any) : any {
		let message;
		switch (method) {
			case TUIConstants.TUIChat.SERVICE.METHOD.UPDATE_MESSAGE_LIST:
				message = params.message;
				// Two screen-up situations
				// 1. If the call message conversationID is currentConversation,
				// You need to use UPDATE_MESSAGE_LIST to update the messageList of TUIStore in the engine to display it on the screen
				// (because you cannot get the messages you sent at this time)
				// 2. If the call message conversationID is not currentConversation,
				// The next time you switch to the conversation where the call message is located, getMessageList can get all the call messages you sent
				// No need to process here
				if (message?.conversationID === this.currentConversationID) {
					const messageList = [...this.currentMessageList, message];
					TUIStore.update(StoreName.CHAT, 'messageList', messageList);
				}
				break;
			case TUIConstants.TUIChat.SERVICE.METHOD.SEND_CUSTOM_MESSAGE:
				TUIChatService.sendCustomMessage(params).then((res : any) => {
					callback && callback(res);
				});
				break;
			case TUIConstants.TUIChat.SERVICE.METHOD.SEND_TEXT_MESSAGE:
				TUIChatService.sendTextMessage(params).then((res : any) => {
					// console.log(res, '====')
					callback && callback(res);
				});
				break;
			case TUIConstants.TUIChat.SERVICE.METHOD.SET_CHAT_TYPE:
				TUIChatConfig.setChatType(params?.chatType);
				break;
			case TUIConstants.TUIChat.SERVICE.METHOD.CLOSE_MESSAGE_POP_MENU:
				TUIStore.update(StoreName.CUSTOM, 'isShowMessagePopMenu', false);
				break;
			default:
				break;
		}
	}
}